ææ°ã®ã¢ããªã±ãŒã·ã§ã³ã«ãããå ç¢ãªã¡ã¢ãªã¯ãªãŒã³ã¢ããã®ããã®ãJavaScriptéåæã³ã³ããã¹ã管çããªãŒã¯æ€åºæŠç¥ãããã³æ€èšŒæè¡ã®è©³çްãªè§£èª¬ã
JavaScriptéåæã³ã³ããã¹ããªãŒã¯ã®æ€åºïŒã³ã³ããã¹ãã¡ã¢ãªã¯ãªãŒã³ã¢ããã®æ€èšŒ
éåæããã°ã©ãã³ã°ã¯çŸä»£ã®JavaScriptéçºã®åºç€ã§ãããI/Oæäœãè€éãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å¹ççãªåŠçãå¯èœã«ããŸããããããéåææäœã®è€éãã¯ã埮åŠã§ãããªããé倧ãªèª²é¡ãããªãã¡éåæã³ã³ããã¹ããªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸãããããã®ãªãŒã¯ã¯ãéåæã¿ã¹ã¯ãæå³ããã寿åœãè¶ ããŠãªããžã§ã¯ããããŒã¿ãžã®åç §ãä¿æããã¬ããŒãžã³ã¬ã¯ã¿ãã¡ã¢ãªãè§£æŸããã®ã劚ããå Žåã«çºçããŸãããã®èšäºã§ã¯ãéåæã³ã³ããã¹ããªãŒã¯ã®æ§è³ªããã®æœåšçãªåœ±é¿ããããŠã³ã³ããã¹ãã¡ã¢ãªã¯ãªãŒã³ã¢ããã®æ€åºãšæ€èšŒã®ããã®å¹æçãªæŠç¥ã«ã€ããŠæ¢ããŸãã
JavaScriptã«ãããéåæã³ã³ããã¹ãã®çè§£
JavaScriptã§ã¯ãéåææäœã¯éåžžãã³ãŒã«ããã¯ãPromiseããŸãã¯async/awaitæ§æã䜿çšããŠåŠçãããŸãããããã®åã¡ã«ããºã ã¯ããã³ã³ããã¹ãããšããæŠå¿µãã€ãŸãéåæã¿ã¹ã¯ãåäœããå®è¡ç°å¢ãå°å ¥ããŸãããã®ã³ã³ããã¹ãã«ã¯ãã¿ã¹ã¯ã«é¢é£ãã倿°ã颿°ã¯ããŒãžã£ããŸãã¯ãã®ä»ã®ããŒã¿æ§é ãå«ãŸããå ŽåããããŸããéåææäœãå®äºãããšãé¢é£ããã³ã³ããã¹ãã¯çæ³çã«ã¯ã¡ã¢ãªãªãŒã¯ãé²ãããã«è§£æŸãããã¹ãã§ãããããããããåžžã«ä¿èšŒãããããã§ã¯ãããŸããã
ãã®åçŽåãããäŸãèããŠã¿ãŸãããïŒ
async function processData(data) {
const largeObject = new Array(1000000).fill(0); // 倧ããªãªããžã§ã¯ããã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 100)); // éåææäœãã·ãã¥ã¬ãŒã
// ã¿ã€ã ã¢ãŠãåŸãlargeObjectã¯äžèŠã«ãªã
return data.length;
}
async function main() {
const data = "Some input data";
const result = await processData(data);
console.log(`Result: ${result}`);
}
main();
ãã®äŸã§ã¯ãlargeObjectã¯processData颿°å
ã§äœæãããŸããçæ³çã«ã¯ãPromiseã解決ããprocessDataãå®äºãããšãlargeObjectã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ãšãªãã¯ãã§ããããããPromiseã®å
éšå®è£
ãåšå²ã®ã³ã³ããã¹ãã®ããããã®éšåã誀ã£ãŠlargeObjectãžã®åç
§ãä¿æãç¶ãããšãã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããããã¯ãé·æéå®è¡ãããã¢ããªã±ãŒã·ã§ã³ããé »ç¹ãªéåææäœãæ±ãå Žåã«ç¹ã«åé¡ãšãªããŸãã
éåæã³ã³ããã¹ããªãŒã¯ã®åœ±é¿
éåæã³ã³ããã¹ããªãŒã¯ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå®å®æ§ã«æ·±å»ãªåœ±é¿ãäžããå¯èœæ§ããããŸãïŒ
- ã¡ã¢ãªæ¶è²»éã®å¢å ïŒ ãªãŒã¯ããã³ã³ããã¹ãã¯æéãšãšãã«èç©ãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãããããªã³ããåŸã ã«å¢å ãããŸããããã«ãããããã©ãŒãã³ã¹ã®äœäžããæçµçã«ã¯ã¡ã¢ãªäžè¶³ãšã©ãŒãçºçããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®äœäžïŒ ã¡ã¢ãªäœ¿çšéãå¢å ãããšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãµã€ã¯ã«ãããé »ç¹ã«ãªããæéããããããã«ãªããŸããããã«ããã貎éãªCPUãªãœãŒã¹ãæ¶è²»ãããã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ã«åœ±é¿ãåºãŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®äžå®å®æ§ïŒ 極端ãªå Žåãã¡ã¢ãªãªãŒã¯ã¯å©çšå¯èœãªã¡ã¢ãªã䜿ãæãããã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãããå¿çããªããªã£ããããåå ãšãªããŸãã
- ãããã°ã®å°é£ãïŒ éåæã³ã³ããã¹ããªãŒã¯ã¯ãæ ¹æ¬åå ãéåææäœããµãŒãããŒãã£ã©ã€ãã©ãªã®å¥¥æ·±ãã«åãããŠããå¯èœæ§ãããããããããã°ãéåžžã«å°é£ãªããšã§ç¥ãããŠããŸãã
éåæã³ã³ããã¹ããªãŒã¯ã®æ€åº
JavaScriptã¢ããªã±ãŒã·ã§ã³ã§éåæã³ã³ããã¹ããªãŒã¯ãæ€åºããããã«ãããã€ãã®ææ³ãçšããããšãã§ããŸãïŒ
1. ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«
ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã¯ãã¡ã¢ãªãªãŒã¯ãç¹å®ããããã«äžå¯æ¬ ã§ããNode.jsãšãŠã§ããã©ãŠã¶ã®äž¡æ¹ããã¡ã¢ãªäœ¿çšéãåæããã¡ã¢ãªå²ãåœãŠãç¹å®ãããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã远跡ã§ããçµã¿èŸŒã¿ã®ã¡ã¢ãªãããã¡ã€ã©ãæäŸããŠããŸãã
- Chrome DevToolsïŒ Chrome DevToolsã¯åŒ·åãªã¡ã¢ãªããã«ãæäŸããŠãããããŒãã¹ãããã·ã§ããã®ååŸãæéçµéã«äŒŽãã¡ã¢ãªå²ãåœãŠã®èšé²ãããã³ïŒãã©ãŠã¶ç°å¢ã§äžè¬çãªã¡ã¢ãªãªãŒã¯ã®åå ã§ããïŒãã¿ãããããDOMããªãŒã®ç¹å®ãå¯èœã§ãããAllocation instrumentation on timelineãæ©èœã䜿çšããŠãç¹å®ã®éåææäœã«é¢é£ããã¡ã¢ãªå²ãåœãŠã远跡ã§ããŸãã
- Node.js InspectorïŒ Node.js Inspectorã䜿çšãããšããããã¬ïŒChrome DevToolsãªã©ïŒãNode.jsããã»ã¹ã«æ¥ç¶ãããã®ã¡ã¢ãªäœ¿çšéãæ€æ»ã§ããŸãã
heapdumpã¢ãžã¥ãŒã«ã䜿çšããŠããŒãã¹ãããã·ã§ãããäœæããChrome DevToolsãä»ã®ã¡ã¢ãªåæããŒã«ã§åæã§ããŸãã`clinic.js`ã®ãããªããŒã«ãéåžžã«åœ¹ç«ã¡ãŸãã
Chrome DevToolsã䜿çšããäŸïŒ
- Chromeã§ã¢ããªã±ãŒã·ã§ã³ãéããŸãã
- Chrome DevToolsãéããŸãïŒCtrl+Shift+IãŸãã¯Cmd+Option+IïŒã
- ã¡ã¢ãªããã«ã«ç§»åããŸãã
- ãAllocation instrumentation on timelineããéžæããŸãã
- èšé²ãéå§ããŸãã
- ã¡ã¢ãªãªãŒã¯ãåŒãèµ·ãããŠãããšçãããã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- èšé²ã忢ããŸãã
- ã¡ã¢ãªå²ãåœãŠã®ã¿ã€ã ã©ã€ã³ãåæããŠãæåŸ éãã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŠããªããªããžã§ã¯ããç¹å®ããŸãã
2. ããŒãã¹ãããã·ã§ãã
ããŒãã¹ãããã·ã§ããã¯ãç¹å®ã®æç¹ã§ã®JavaScriptããŒãã®ç¶æ ããã£ããã£ããŸããç°ãªãæç¹ã§ååŸããããŒãã¹ãããã·ã§ãããæ¯èŒããããšã§ãæåŸ 以äžã«é·ãã¡ã¢ãªã«ä¿æãããŠãããªããžã§ã¯ããç¹å®ã§ããŸããããã¯ãæœåšçãªã¡ã¢ãªãªãŒã¯ãçªãæ¢ããã®ã«åœ¹ç«ã¡ãŸãã
Node.jsãšheapdumpã䜿çšããäŸïŒ
const heapdump = require('heapdump');
async function processData(data) {
const largeObject = new Array(1000000).fill(0);
await new Promise(resolve => setTimeout(resolve, 100));
return data.length;
}
async function main() {
const data = "Some input data";
const result = await processData(data);
console.log(`Result: ${result}`);
heapdump.writeSnapshot('heapdump1.heapsnapshot');
await new Promise(resolve => setTimeout(resolve, 1000)); // GCã®å®è¡ãåŸ
ã€
heapdump.writeSnapshot('heapdump2.heapsnapshot');
}
main();
ãã®ã³ãŒããå®è¡ããåŸãheapdump1.heapsnapshotãšheapdump2.heapsnapshotãã¡ã€ã«ãChrome DevToolsãä»ã®ã¡ã¢ãªåæããŒã«ã§åæããéåææäœã®ååŸã®ããŒãã®ç¶æ
ãæ¯èŒã§ããŸãã
3. WeakRefsãšFinalizationRegistry
çŸä»£ã®JavaScriptã¯WeakRefãšFinalizationRegistryãæäŸããŠããããããã¯ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã远跡ãããªããžã§ã¯ãããã€ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããããæ€åºããããã®è²ŽéãªããŒã«ã§ããWeakRefã¯ããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããããšãªãããã®ãªããžã§ã¯ããžã®åç
§ãä¿æããããšãå¯èœã«ããŸããFinalizationRegistryã¯ããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«å®è¡ãããã³ãŒã«ããã¯ãç»é²ããããšãå¯èœã«ããŸãã
WeakRefãšFinalizationRegistryã䜿çšããäŸïŒ
const registry = new FinalizationRegistry(heldValue => {
console.log(`Object with held value ${heldValue} has been garbage collected.`);
});
async function processData(data) {
const largeObject = new Array(1000000).fill(0);
const weakRef = new WeakRef(largeObject);
registry.register(largeObject, "largeObject");
await new Promise(resolve => setTimeout(resolve, 100));
return data.length;
}
async function main() {
const data = "Some input data";
const result = await processData(data);
console.log(`Result: ${result}`);
// æç€ºçã«GCãããªã¬ãŒããããšè©Šã¿ãïŒä¿èšŒã¯ãããªãïŒ
global.gc();
await new Promise(resolve => setTimeout(resolve, 1000)); // GCã«æéãäžãã
}
main();
ãã®äŸã§ã¯ãlargeObjectãžã®WeakRefãäœæãããããFinalizationRegistryã«ç»é²ããŸããlargeObjectãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãFinalizationRegistryå
ã®ã³ãŒã«ããã¯ãå®è¡ããããªããžã§ã¯ããã¯ãªãŒã³ã¢ãããããããšã確èªã§ããŸããæ³šæç¹ãšããŠãglobal.gc()ã®æç€ºçãªåŒã³åºãã¯ãã¬ããŒãžã³ã¬ã¯ã¿ã®éåžžã®åäœã劚ããå¯èœæ§ããããããæ¬çªã³ãŒãã§ã¯äžè¬çã«æšå¥šãããŸãããããã¯ãã¹ãç®çã§ãã
4. èªåãã¹ããšã¢ãã¿ãªã³ã°
ã¡ã¢ãªãªãŒã¯æ€åºãèªåãã¹ããšã¢ãã¿ãªã³ã°ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã«çµ±åããããšã§ãã¡ã¢ãªãªãŒã¯ãæ¬çªç°å¢ã«å°éããã®ãé²ãããšãã§ããŸããMochaãJestãCypressãªã©ã®ããŒã«ã䜿çšããŠãç¹ã«ã¡ã¢ãªãªãŒã¯ããã§ãã¯ãããã¹ããäœæã§ããŸãããããã®ãã¹ãã¯CI/CDãã€ãã©ã€ã³ã®äžéšãšããŠå®è¡ããæ°ããã³ãŒã倿Žãã¡ã¢ãªãªãŒã¯ãå°å ¥ããªãããšãä¿èšŒã§ããŸãã
Jestãšheapdumpã䜿çšããäŸïŒ
const heapdump = require('heapdump');
async function processData(data) {
const largeObject = new Array(1000000).fill(0);
await new Promise(resolve => setTimeout(resolve, 100));
return data.length;
}
describe('Memory Leak Test', () => {
it('should not leak memory after processing data', async () => {
const data = "Some input data";
heapdump.writeSnapshot('heapdump_before.heapsnapshot');
const result = await processData(data);
heapdump.writeSnapshot('heapdump_after.heapsnapshot');
// ããŒãã¹ãããã·ã§ãããæ¯èŒããŠã¡ã¢ãªãªãŒã¯ãæ€åº
// (éåžžã¯ã¡ã¢ãªåæã©ã€ãã©ãªã䜿çšããŠ
// ããã°ã©ã ã§ã¹ãããã·ã§ãããåæããå¿
èŠããã)
expect(result).toBeDefined(); // ãããŒã®ã¢ãµãŒã·ã§ã³
// TODO: å®éã®ã¹ãããã·ã§ããæ¯èŒããžãã¯ãããã«è¿œå
}, 10000); // éåææäœã®ããã®ã¿ã€ã ã¢ãŠããå»¶é·
});
ãã®äŸã§ã¯ãprocessData颿°ãå®è¡ãããååŸã«ããŒãã¹ãããã·ã§ãããååŸããJestãã¹ããäœæããŸãããã®åŸããã¹ãã¯ããŒãã¹ãããã·ã§ãããæ¯èŒããŠã¡ã¢ãªãªãŒã¯ãæ€åºããŸããæ³šæïŒå®å
šã«èªååãããã¹ãããã·ã§ããæ¯èŒãå®è£
ããã«ã¯ãã¡ã¢ãªåæçšã«èšèšãããããé«åºŠãªããŒã«ãã©ã€ãã©ãªãå¿
èŠã§ãããã®äŸã¯åºæ¬çãªãã¬ãŒã ã¯ãŒã¯ã瀺ããŠããŸãã
ã³ã³ããã¹ãã¡ã¢ãªã¯ãªãŒã³ã¢ããã®æ€èšŒ
ã¡ã¢ãªãªãŒã¯ã®æ€åºã¯æåã®ã¹ãããã«éããŸãããæœåšçãªãªãŒã¯ãç¹å®ãããããã³ã³ããã¹ãã¡ã¢ãªãæ£ããã¯ãªãŒã³ã¢ãããããŠããããšãæ€èšŒããããšãéèŠã§ããããã«ã¯ããªãŒã¯ã®æ ¹æ¬åå ãçè§£ããé©åãªä¿®æ£ãå®è£ ããããšãå«ãŸããŸãã
1. æ ¹æ¬åå ã®ç¹å®
éåæã³ã³ããã¹ããªãŒã¯ã®æ ¹æ¬åå ã¯ãç¹å®ã®ã³ãŒãã䜿çšãããŠããéåæããã°ã©ãã³ã°ãã¿ãŒã³ã«ãã£ãŠç°ãªããŸããäžè¬çãªåå ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- è§£æŸãããªãåç §ïŒ éåæã¿ã¹ã¯ãããã¯ãäžèŠã«ãªã£ããªããžã§ã¯ããããŒã¿ãžã®åç §ã誀ã£ãŠä¿æãç¶ããããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããããšããããŸããããã¯ãã¯ããŒãžã£ãã€ãã³ããªã¹ãããŸãã¯åŒ·åãªåç §ãäœæããä»ã®ã¡ã«ããºã ã«ãã£ãŠçºçããå¯èœæ§ããããŸããã¯ããŒãžã£ãã€ãã³ããªã¹ããæ³šææ·±ãæ€æ»ããéåææäœãå®äºããåŸã«ããããé©åã«ã¯ãªãŒã³ã¢ãããããããšã確èªããŠãã ããã
- 埪ç°äŸåïŒ ãªããžã§ã¯ãéã®åŸªç°äŸåã¯ãããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããå¯èœæ§ããããŸãã2ã€ã®ãªããžã§ã¯ããäºãã«åç §ãä¿æããŠããå Žåãäž¡æ¹ã®åç §ãåæããããŸã§ã©ã¡ãã®ãªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŸãããå¯èœãªéã埪ç°äŸåãè§£æ¶ããŠãã ããã
- ã°ããŒãã«å€æ°ïŒ ã°ããŒãã«å€æ°ã«ããŒã¿ãä¿åãããšãæå³ããããŠãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããå¯èœæ§ããããŸããå¯èœãªéãã°ããŒãã«å€æ°ã®äœ¿çšãé¿ããããŒã«ã«å€æ°ãããŒã¿æ§é ã䜿çšããŠãã ããã
- ãµãŒãããŒãã£ã©ã€ãã©ãªïŒ ã¡ã¢ãªãªãŒã¯ã¯ããµãŒãããŒãã£ã©ã€ãã©ãªã®ãã°ã«ãã£ãŠãåŒãèµ·ããããããšããããŸãããµãŒãããŒãã£ã©ã€ãã©ãªãã¡ã¢ãªãªãŒã¯ãåŒãèµ·ãããŠãããšçãããå Žåã¯ãåé¡ãç¹å®ããã©ã€ãã©ãªã®ã¡ã³ãããŒã«å ±åããŠã¿ãŠãã ããã
- å¿ããããã€ãã³ããªã¹ãïŒ DOMèŠçŽ ãä»ã®ãªããžã§ã¯ãã«ã¢ã¿ãããããã€ãã³ããªã¹ãã¯ãäžèŠã«ãªã£ããšãã«åé€ããå¿ èŠããããŸããã€ãã³ããªã¹ãã®åé€ãå¿ãããšãé¢é£ãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããå¯èœæ§ããããŸããã³ã³ããŒãã³ãããªããžã§ã¯ããç Žæ£ãããããã€ãã³ãéç¥ãäžèŠã«ãªã£ããããå Žåã¯ãåžžã«ã€ãã³ããªã¹ãã®ç»é²ãè§£é€ããŠãã ããã
2. ã¯ãªãŒã³ã¢ããæŠç¥ã®å®è£
ã¡ã¢ãªãªãŒã¯ã®æ ¹æ¬åå ãç¹å®ãããããã³ã³ããã¹ãã¡ã¢ãªãæ£ããè§£æŸãããããã«ãé©åãªã¯ãªãŒã³ã¢ããæŠç¥ãå®è£ ã§ããŸãã
- åç
§ã®åæïŒ ãã¯ãäžèŠã«ãªã£ããªããžã§ã¯ããžã®åç
§ãåæããããã«ã倿°ããªããžã§ã¯ãã®ããããã£ãæç€ºçã«
nullãŸãã¯undefinedã«èšå®ããŸãã - ã€ãã³ããªã¹ãã®åé€ïŒ
removeEventListenerã䜿çšããŠã€ãã³ããªã¹ããåé€ãããªããžã§ã¯ããžã®åç §ãä¿æããã®ãé²ããŸãã - WeakRefã®äœ¿çšïŒ
WeakRefã䜿çšããŠããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããã®ã劚ããããšãªããããããžã®åç §ãä¿æããŸãã - ã¯ããŒãžã£ã®æ éãªç®¡çïŒ ã¯ããŒãžã£ãšããããã£ããã£ãã倿°ã«æ³šæããŠãã ãããã¯ããŒãžã£ããã¯ãäžèŠã«ãªã£ããªããžã§ã¯ããžã®åç §ãä¿æããªãããã«ããŸãã颿°ãã¡ã¯ããªãã«ãªãŒåãªã©ã®ãã¯ããã¯ã䜿çšããŠãã¯ããŒãžã£å ã®å€æ°ã®ã¹ã³ãŒããå¶åŸ¡ããããšãæ€èšããŠãã ããã
- ãªãœãŒã¹ç®¡çïŒ ãã¡ã€ã«ãã³ãã«ããããã¯ãŒã¯æ¥ç¶ãããŒã¿ããŒã¹æ¥ç¶ãªã©ã®ãªãœãŒã¹ãé©åã«ç®¡çããŸãããããã®ãªãœãŒã¹ãäžèŠã«ãªã£ããšãã«ãããããéãããããè§£æŸãããããšã確èªããŠãã ããã
3. æ€èšŒæè¡
ã¯ãªãŒã³ã¢ããæŠç¥ãå®è£ ããåŸãã¡ã¢ãªãªãŒã¯ã解決ãããããšãæ€èšŒããããšãäžå¯æ¬ ã§ããæ€èšŒã«ã¯ä»¥äžã®æè¡ã䜿çšã§ããŸãïŒ
- ã¡ã¢ãªãããã¡ã€ãªã³ã°ã®ç¹°ãè¿ãïŒ å ã«èª¬æããã¡ã¢ãªãããã¡ã€ãªã³ã°ã®æé ãç¹°ãè¿ããã¡ã¢ãªäœ¿çšéãæéãšãšãã«å¢å ããªããªã£ãããšã確èªããŸãã
- ããŒãã¹ãããã·ã§ããã®æ¯èŒïŒ ã¯ãªãŒã³ã¢ããæŠç¥ãå®è£ ãããååŸã«ååŸããããŒãã¹ãããã·ã§ãããæ¯èŒãããªãŒã¯ããŠãããªããžã§ã¯ããã¡ã¢ãªå ã«ååšããªããªã£ãããšã確èªããŸãã
- èªåãã¹ãïŒ ã¡ã¢ãªãªãŒã¯ã®ãã§ãã¯ãå«ãããã«èªåãã¹ããæŽæ°ããŸãããã¹ããç¹°ãè¿ãå®è¡ããŠãã¯ãªãŒã³ã¢ããæŠç¥ã广çã§ãããæ°ããªåé¡ãåŒãèµ·ãããªãããšã確èªããŸãããã¹ãå®è¡äžã«ã¡ã¢ãªäœ¿çšéãç£èŠããæœåšçãªãªãŒã¯ãèŠåã§ããããŒã«ã䜿çšããŸãã
- é·æéå®è¡ãã¹ãïŒ çæéã®ãã¹ãã§ã¯æããã«ãªããªãå¯èœæ§ã®ããã¡ã¢ãªãªãŒã¯ãç¹å®ããããã«ãå®éã®äœ¿çšãã¿ãŒã³ãã·ãã¥ã¬ãŒãããé·æéå®è¡ãã¹ããå®è¡ããŸããããã¯ãé·æéå®è¡ãããããšãæåŸ ãããã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠç¹ã«éèŠã§ãã
éåæã³ã³ããã¹ããªãŒã¯ãé²ãããã®ãã¹ããã©ã¯ãã£ã¹
éåæã³ã³ããã¹ããªãŒã¯ãé²ãã«ã¯ãç©æ¥µçãªã¢ãããŒããšéåæããã°ã©ãã³ã°ååã®æ·±ãçè§£ãå¿ èŠã§ãã以äžã«ããã€ãã®ãã¹ããã©ã¯ãã£ã¹ã瀺ããŸãïŒ
- ææ°ã®JavaScriptæ©èœã䜿çšããïŒ
WeakRefãFinalizationRegistryãasync/awaitãªã©ã®ææ°ã®JavaScriptæ©èœã掻çšããŠãéåæããã°ã©ãã³ã°ãç°¡çŽ åããã¡ã¢ãªãªãŒã¯ã®ãªã¹ã¯ãäœæžããŸãã - ã°ããŒãã«å€æ°ãé¿ããïŒ ã°ããŒãã«å€æ°ã®äœ¿çšãæå°éã«æãã代ããã«ããŒã«ã«å€æ°ãããŒã¿æ§é ã䜿çšããŸãã
- ã€ãã³ããªã¹ããæ éã«ç®¡çããïŒ äžèŠã«ãªã£ãã€ãã³ããªã¹ãã¯å¿ ãåé€ããŸãã
- ã¯ããŒãžã£ã«æ³šæããïŒ ã¯ããŒãžã£ã«ãã£ãŠãã£ããã£ããã倿°ãæèãããããããã¯ãäžèŠã«ãªã£ããªããžã§ã¯ããžã®åç §ãä¿æããªãããã«ããŸãã
- ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã宿çã«äœ¿çšããïŒ éçºã¯ãŒã¯ãããŒã«ã¡ã¢ãªãããã¡ã€ãªã³ã°ãçµã¿èŸŒã¿ãã¡ã¢ãªãªãŒã¯ãæ©æã«ç¹å®ããŠå¯ŸåŠããŸãã
- ã¡ã¢ãªãªãŒã¯ãã§ãã¯ä»ãã®ãŠããããã¹ããäœæããïŒ ã¡ã¢ãªãªãŒã¯ãååšããªãããšã確èªããããã®ãŠããããã¹ããçµ±åããŸãã
- ã³ãŒãã¬ãã¥ãŒïŒ éçºããã»ã¹ã«ã³ãŒãã¬ãã¥ãŒãçµã¿èŸŒã¿ãæœåšçãªã¡ã¢ãªãªãŒã¯ãæ©æã«ç¹å®ããŸãã
- ææ°ã®ç¶æ ãä¿ã€ïŒ JavaScriptã©ã³ã¿ã€ã ç°å¢ïŒNode.jsãŸãã¯ãã©ãŠã¶ïŒãšãµãŒãããŒãã£ã©ã€ãã©ãªãææ°ã®ç¶æ ã«ä¿ã¡ããã°ä¿®æ£ãããã©ãŒãã³ã¹æ¹åã®æ©æµãåããŸãã
çµè«
éåæã³ã³ããã¹ããªãŒã¯ã¯ãJavaScriptã¢ããªã±ãŒã·ã§ã³ã«ãããŠåŸ®åŠã§ãããªããæœåšçã«æå®³ãäžããåé¡ã§ããéåæã³ã³ããã¹ãã®æ§è³ªãçè§£ãã广çãªæ€åºæè¡ãçšããã¯ãªãŒã³ã¢ããæŠç¥ãå®è£ ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯å ç¢ã§ã¡ã¢ãªå¹çã®è¯ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããè¯å¥œãªããã©ãŒãã³ã¹ãç¶æããé·æã«ããã£ãŠå®å®ãããããšãã§ããŸããã¡ã¢ãªç®¡çãåªå ãã宿çãªã¡ã¢ãªãããã¡ã€ãªã³ã°ãéçºããã»ã¹ã«çµã¿èŸŒãããšã¯ãJavaScriptã¢ããªã±ãŒã·ã§ã³ã®é·æçãªå¥å šæ§ãšä¿¡é Œæ§ã確ä¿ããããã«äžå¯æ¬ ã§ãã